<?php
namespace Home\Model;
use Think\Model;
// +----------------------------------------------------------------------
// | Date:2016年12月30日
// +----------------------------------------------------------------------
// | Author: EK_熊<1439527494@qq.com>
// +----------------------------------------------------------------------
// | Description: 此文件作用于****
// +----------------------------------------------------------------------
class FavoriteModel extends Model{
    protected $trueTableName = 'idea_product_favorite';
    protected $errMsg='';
    protected $labelModel = '';
    protected $uid = '';
    
    protected $label_list = [];
    function _initialize(){
        $this->labelModel = M('ProductLabel');
        $this->uid = get_login_userid();
    }
    
    /**
     * 添加收藏：
     * 添加同时会添加标签
     * @param array $labelname
     * @param unknown $proid
     * date:2016年12月30日
     * author: EK_熊
     */
    function fav_add($labelname='',$proid){
       $labelnameAry = is_array($labelname) ? $labelname : explode(',',$labelname);
       $existFavData = $this->where(['pro_id'=>$proid,'uid'=>$this->uid])->find();
       $existLabData = $this->labelModel->where(['uid'=>$this->uid])->getField('label_name,label_id',true);
       if($existFavData) $this->where(['pro_id'=>$proid,'uid'=>$this->uid])->setField('status',0); //进入循环前，先把全部数据设置为关闭状态，进行重洗
       
       for($i=0;$i<count($labelnameAry);$i++){
            $labelID = 0;
            $labelName = $labelnameAry[$i];
            
            if ($labelName) {
               if ($existLabData[$labelName]){
                   $labelID = $existLabData[$labelName];//3.添加收藏数据，旧数据存在标签，不需要添加标签
               }else{
                   $labelID = $this->label_add($labelName);//4.添加收藏数据，旧数据不存在标签，需要添加标签
                   if (!$labelID) return '数据异常,标签添加失败!!';
               }
           }
           $existFavData = $this->where(['pro_id'=>$proid,'uid'=>$this->uid,'status'=>0])->find();
           if ($existFavData) {
                $updateFavMap['status'] = '1';
                $updateFavMap['update_time'] = CURRENT_TIME;
                $updateFavMap['label_id'] = $labelID;
                $updateFav = $this->_fav_edit($existFavData['fav_id'],$updateFavMap);//2.如果有旧数据，执行修改数据
           }else{
               
              $this->_fav_add($labelID, $proid);//1.添加收藏记录 
           }
                
       }
       

    }
    
    /**
     * 添加收藏：数据增加
     * @param unknown $labelID
     * @param unknown $proid
     * date:2017年1月10日
     * author: EK_熊
     */
    private function _fav_add($labelID,$proid){
        $addData = [
            'label_id'=>$labelID,
            'pro_id'=>$proid,
            'created_time'=>CURRENT_TIME,
            'update_time'=>CURRENT_TIME,
            'uid'=>$this->uid,
            'status'=>1,
        ];
        $ret = $this->add($addData);
        if (!$ret) {
            $this->errMsg = '收藏记录添加失败！！';
            exit();
        }  
        
        return true;
    }
    
    /**
     * 添加收藏：数据修改
     * @param unknown $favid
     * @param unknown $data
     * date:2017年1月10日
     * author: EK_熊
     */
    private function _fav_edit($favid,$data){
        $ret = $this->where(['fav_id'=>$favid])->save($data);
        if (!$ret) {
            $this->errMsg = '收藏记录修改失败！！';
            exit();
        }
        
        return true;
    }
    
    
    
    /**
     * 取消收藏
     * @param array $labelname
     * @param unknown $proid
     * date:2016年12月30日
     * author: EK_熊
     */
    function fav_edit($newLabel=[],$oldeLabel=[],$proid){
        $newLabel = explode(',',$newLabel);
        $oldeLabel = explode(',',$oldeLabel);
        $diff = array_values(array_diff_assoc($newLabel,$oldeLabel));//新的标签
        $equal = array_intersect($oldeLabel,$newLabel);//新旧标签共有的数据

        if ($equal) {
            $equalIdBox = $this->labelModel->where(['uid'=>$this->uid,'pro_id'=>$proid,'label_name'=>['in',$equal]])->getField('label_id',true);
            $updateFavLog = $this->where(['uid'=>$this->uid,'pro_id'=>$proid,'label_id'=>['not in',$equalIdBox]])->setField('status',0);
        }else{
            $updateFavLog = $this->where(['uid'=>$this->uid,'pro_id'=>$proid])->setField('status',0);
        }
        
        if ($diff) {
            $this->fav_add($diff,$proid);
        }
    }
    
    
    /**
     * 根据用户id，和当前文章id，获取标签,
     * TODO优化空间：可以把数据存进cookie
     * @param unknown $proid //不传，就获取当前用户的全部标签
     * date:2016年12月30日
     * author: EK_熊
     */
    function label_in_article($proid=''){
        $where = ['fav.uid'=>$this->uid,'status'=>1];
        $model = $this->alias('fav')
            ->join('LEFT JOIN __PRODUCT_LABEL__ label ON label.label_id = fav.label_id');
        
        $where['pro_id'] = $proid;
        $ret = $model->where($where)->getField('label_name',true);
        return $ret;
       
    }
    
    /**
     * 获取当前用户收藏数据的全部标签,
     * TODO优化空间：可以把数据存进cookie
     * @param unknown $proid //不传，就获取当前用户的全部标签
     * 
     * @return:
     *  'label_total' => int 0   //全部标签数量
        'label_list' => []       //已经添加了标签的文章列表
        'label_empty' => int 0   //已收藏，未添加标签的文章列表
     * date:2016年12月30日
     * author: EK_熊
     */
    function label_list_user_all(){
        $label_map = ['uid'=>$this->uid];
        $ret['label_total']=(int)$this->labelModel->where($label_map)->count();
        $ret['label_list'] = [];
        $ret['label_empty'] = 0;
        //计算各个标签的收藏数量
         $countFavNum = $this->alias('fav')
                 ->where(['uid'=>$this->uid,'status'=>1])
                 ->group('label_id')
                 ->getField('label_id,count(*) as num'); 
         if ($countFavNum) {
             
            $allLabel = $this->labelModel->where($label_map)->field('label_name,label_id')->select();         
            foreach ($allLabel as $k=>$v){
                $num = $countFavNum[$v['label_id']];
                
                $allLabel[$k]['total'] = $num ? $num : 0;
            }
            if ($countFavNum[0]) $ret['label_empty']=$countFavNum[0];
            $ret['label_list'] = $allLabel;
         }
        return $ret;
        
    }

    
    
    /**
     * 处理当前用户数据，补充标签名称字段,
     * @param unknown $data
     * @param unknown $propk 链接字段
     * date:2017年1月5日
     * author: EK_熊
     */
    function label_append_by_proid($data,$propk='id'){
        $where = ['fav.uid'=>$this->uid,'status'=>1,'label.uid'=>$this->uid];
        foreach ($data as $k=>$v) {
            $proidBox[] = $v['id'];
        }
        if ($proidBox) $where['fav.pro_id'] = ['in',$proidBox];
        $labelBox = $this->alias('fav')
            ->join('LEFT JOIN __PRODUCT_LABEL__ label ON label.label_id = fav.label_id')
            ->where($where)->field('pro_id,fav.label_id,label_name')->select();

        if ($labelBox) {
            foreach ($data as $k=>$v){
                $data[$k]['label_name']='';
                for($i=0;$i<count($labelBox);$i++) {
                    if ($v[$propk] == $labelBox[$i]['pro_id'] && $labelBox[$i]['label_name']) {
                        $data[$k]['label_name'][] = $labelBox[$i]['label_name'];
                    }
                }
            }
        }
        return $data;
    }
    
    /**
     * 创建单条标签，创建前会执行存在检查
     * @param array $labelname
     * @return mixed|boolean|unknown|string
     * date:2016年12月30日
     * author: EK_熊
     */
    function label_add($labelname=''){
        $ret = $this->labelModel->add([
            'label_name'=>$labelname,
            'created_time'=>CURRENT_TIME,
            'uid'=>$this->uid,
        ]);
        
        if (!$ret) $this->errMsg='标签数据创建失败！';
        return $ret;
    }
    
    function getError(){
        return $this->errMsg;
    }
    
}